home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Resources / Online / Term / Extras / Source / term-source.lha / PickScreen.c < prev    next >
C/C++ Source or Header  |  1996-10-20  |  5KB  |  299 lines

  1. /*
  2. **    PickScreen.c
  3. **
  4. **    Simplified public screen selection routine
  5. **
  6. **    Copyright © 1990-1996 by Olaf `Olsen' Barthel
  7. **        All Rights Reserved
  8. **
  9. **    :ts=4
  10. */
  11.  
  12. #ifndef _GLOBAL_H
  13. #include "Global.h"
  14. #endif
  15.  
  16. enum    {    GAD_LIST=1,GAD_USE,GAD_CANCEL };
  17.  
  18.     /* BuildScreenList():
  19.      *
  20.      *    Build a private copy of the public screen list.
  21.      */
  22.  
  23. STATIC struct List *
  24. BuildScreenList(VOID)
  25. {
  26.     struct List *List,*PubScreenList;
  27.  
  28.         /* Get the list body. */
  29.  
  30.     if(List = CreateList())
  31.     {
  32.             /* Get access to the public screen list. */
  33.  
  34.         if(PubScreenList = LockPubScreenList())
  35.         {
  36.             struct Node *Next,*Node;
  37.  
  38.                 /* Scan the list. */
  39.  
  40.             for(Node = PubScreenList->lh_Head ; Next = Node->ln_Succ ; Node = Next)
  41.             {
  42.                     /* Don't include the current `term' public
  43.                      * screen name in it.
  44.                      */
  45.  
  46.                 if(strcmp(Node->ln_Name,TermIDString))
  47.                 {
  48.                     struct Node *New;
  49.  
  50.                         /* Got a new node? */
  51.  
  52.                     if(New = CreateNode(Node->ln_Name))
  53.                         AddTail(List,New);
  54.                 }
  55.             }
  56.  
  57.             UnlockPubScreenList();
  58.         }
  59.  
  60.             /* In case the list happens to remain empty,
  61.              * include the Workbench screen in it.
  62.              */
  63.  
  64.         if(IsListEmpty(List))
  65.         {
  66.             struct Node *New;
  67.  
  68.             if(New = CreateNode("Workbench"))
  69.                 AddTail(List,New);
  70.             else
  71.             {
  72.                 FreeVecPooled(List);
  73.                 List = NULL;
  74.             }
  75.         }
  76.     }
  77.  
  78.     return(List);
  79. }
  80.  
  81.     /* PickScreen(STRPTR Name):
  82.      *
  83.      *    Your nice public screen selection routine.
  84.      */
  85.  
  86. BOOL
  87. PickScreen(struct Window *Window,STRPTR Name)
  88. {
  89.     struct List    *ScreenList;
  90.     BOOL Result;
  91.  
  92.     Result = FALSE;
  93.  
  94.     if(ScreenList = BuildScreenList())
  95.     {
  96.         LayoutHandle *Handle;
  97.  
  98.         if(Handle = LT_CreateHandleTags(Window->WScreen,
  99.             LAHN_LocaleHook,    &LocaleHook,
  100.         TAG_DONE))
  101.         {
  102.             LONG MaxWidth,MaxHeight,Len;
  103.             struct Window *PanelWindow;
  104.             struct Node    *Node;
  105.             ULONG Index,i;
  106.  
  107.             Index = (ULONG)~0;
  108.  
  109.             MaxWidth    = 0;
  110.             MaxHeight    = 0;
  111.  
  112.             for(Node = ScreenList->lh_Head, i = 0 ; Node->ln_Succ ; Node = Node->ln_Succ, i++)
  113.             {
  114.                 if(!Stricmp(Node->ln_Name,Name))
  115.                     Index = i;
  116.  
  117.                 Len = strlen(Node->ln_Name);
  118.  
  119.                 if(Len > MaxWidth)
  120.                     MaxWidth = Len;
  121.  
  122.                 MaxHeight++;
  123.             }
  124.  
  125.             if(MaxWidth < 30)
  126.                 MaxWidth = 30;
  127.  
  128.             if(MaxHeight < 5)
  129.                 MaxHeight = 5;
  130.             else
  131.             {
  132.                 if(MaxHeight > 20)
  133.                     MaxHeight = 20;
  134.             }
  135.  
  136.             LT_New(Handle,
  137.                 LA_Type,    VERTICAL_KIND,
  138.             TAG_DONE);
  139.             {
  140.                 LT_New(Handle,
  141.                     LA_Type,    VERTICAL_KIND,
  142.                 TAG_DONE);
  143.                 {
  144.                     LT_New(Handle,
  145.                         LA_Type,        LISTVIEW_KIND,
  146.                         LA_Chars,        30,
  147.                         LA_ID,            GAD_LIST,
  148.                         LALV_Lines,        5,
  149.                         LALV_MaxGrowX,    MaxWidth,
  150.                         LALV_MaxGrowY,    MaxHeight,
  151.                         LALV_ResizeY,    TRUE,
  152.                         GTLV_Labels,    ScreenList,
  153.                         GTLV_Selected,    Index,
  154.                         LALV_Link,        NIL_LINK,
  155.                         LALV_CursorKey,    TRUE,
  156.                     TAG_DONE);
  157.  
  158.                     LT_EndGroup(Handle);
  159.                 }
  160.  
  161.                 LT_New(Handle,
  162.                     LA_Type,VERTICAL_KIND,
  163.                 TAG_DONE);
  164.                 {
  165.                     LT_New(Handle,
  166.                         LA_Type,        XBAR_KIND,
  167.                         LAXB_FullSize,    TRUE,
  168.                     TAG_DONE);
  169.  
  170.                     LT_EndGroup(Handle);
  171.                 }
  172.  
  173.                 LT_New(Handle,LA_Type,HORIZONTAL_KIND,
  174.                     LAGR_SameSize,    TRUE,
  175.                     LAGR_Spread,    TRUE,
  176.                 TAG_DONE);
  177.                 {
  178.                     LT_New(Handle,
  179.                         LA_Type,        BUTTON_KIND,
  180.                         LA_LabelID,        MSG_GLOBAL_USE_GAD,
  181.                         LA_ID,            GAD_USE,
  182.                         LABT_ReturnKey,    TRUE,
  183.                         LABT_ExtraFat,    TRUE,
  184.                     TAG_DONE);
  185.  
  186.                     LT_New(Handle,
  187.                         LA_Type,        BUTTON_KIND,
  188.                         LA_LabelID,        MSG_GLOBAL_CANCEL_GAD,
  189.                         LA_ID,            GAD_CANCEL,
  190.                         LABT_EscKey,    TRUE,
  191.                         LABT_ExtraFat,    TRUE,
  192.                     TAG_DONE);
  193.  
  194.                     LT_EndGroup(Handle);
  195.                 }
  196.  
  197.                 LT_EndGroup(Handle);
  198.             }
  199.  
  200.             if(PanelWindow = LT_Build(Handle,
  201.                 LAWN_TitleID,        MSG_TERMPICKSCREEN_SCREENS_TXT,
  202.                 LAWN_HelpHook,        &GuideHook,
  203.                 LAWN_Parent,        Window,
  204.                 WA_DepthGadget,        TRUE,
  205.                 WA_DragBar,            TRUE,
  206.                 WA_RMBTrap,            TRUE,
  207.                 WA_Activate,        TRUE,
  208.                 WA_SimpleRefresh,    TRUE,
  209.             TAG_DONE))
  210.             {
  211.                 struct IntuiMessage    *Message;
  212.                 struct Gadget *MsgGadget;
  213.                 ULONG MsgClass;
  214.                 UWORD MsgCode;
  215.                 BOOL Done;
  216.  
  217.                 LT_ShowWindow(Handle,TRUE);
  218.  
  219.                 PushWindow(PanelWindow);
  220.  
  221.                 Done = FALSE;
  222.  
  223.                 do
  224.                 {
  225.                     if(Wait(PORTMASK(PanelWindow->UserPort) | SIG_BREAK) & SIG_BREAK)
  226.                         break;
  227.  
  228.                     while(Message = (struct IntuiMessage *)LT_GetIMsg(Handle))
  229.                     {
  230.                         MsgClass    = Message->Class;
  231.                         MsgCode        = Message->Code;
  232.                         MsgGadget    = (struct Gadget *)Message->IAddress;
  233.  
  234.                         LT_ReplyIMsg(Message);
  235.  
  236.                         if(MsgClass == IDCMP_GADGETUP)
  237.                         {
  238.                             switch(MsgGadget->GadgetID)
  239.                             {
  240.                                 case GAD_USE:
  241.  
  242.                                     if(Index != (ULONG)~0)
  243.                                     {
  244.                                         struct Node *Node;
  245.  
  246.                                         if(Node = GetListNode(Index,ScreenList))
  247.                                         {
  248.                                             strcpy(Name,Node->ln_Name);
  249.  
  250.                                             Result = TRUE;
  251.                                         }
  252.                                     }
  253.  
  254.                                     Done = TRUE;
  255.                                     break;
  256.  
  257.                                 case GAD_CANCEL:
  258.  
  259.                                     Done = TRUE;
  260.                                     break;
  261.  
  262.                                 case GAD_LIST:
  263.  
  264.                                     Index = MsgCode;
  265.                                     break;
  266.                             }
  267.                         }
  268.  
  269.                         if(MsgClass == IDCMP_IDCMPUPDATE)
  270.                         {
  271.                             struct Node *Node;
  272.  
  273.                             if(Node = GetListNode(Index = MsgCode,ScreenList))
  274.                             {
  275.                                 strcpy(Name,Node->ln_Name);
  276.  
  277.                                 Done = Result = TRUE;
  278.  
  279.                                 LT_PressButton(Handle,GAD_USE);
  280.                             }
  281.                         }
  282.                     }
  283.                 }
  284.                 while(!Done);
  285.  
  286.                 PopWindow();
  287.             }
  288.  
  289.             LT_DeleteHandle(Handle);
  290.         }
  291.  
  292.         DeleteList(ScreenList);
  293.     }
  294.     else
  295.         DisplayBeep(Window->WScreen);
  296.  
  297.     return(Result);
  298. }
  299.